package com.atguigu.schedule.mapper;

import com.atguigu.schedule.pojo.VerificationCode;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 验证码Mapper接口
 * 
 * @author atguigu
 * @since 2024
 */
@Mapper
public interface VerificationCodeMapper {
    
    /**
     * 插入验证码
     * 
     * @param verificationCode 验证码信息
     * @return 影响行数
     */
    int insert(VerificationCode verificationCode);
    
    /**
     * 根据ID查询验证码
     * 
     * @param id 验证码ID
     * @return 验证码信息
     */
    VerificationCode selectById(@Param("id") Long id);
    
    /**
     * 查找有效的验证码
     * 
     * @param phone 手机号
     * @param code 验证码
     * @param now 当前时间
     * @return 验证码信息
     */
    VerificationCode selectValidCode(@Param("phone") String phone, 
                                   @Param("code") String code, 
                                   @Param("now") LocalDateTime now);
    
    /**
     * 查找最近1小时内的未使用验证码
     * 
     * @param oneHourAgo 一小时前的时间
     * @return 验证码列表
     */
    List<VerificationCode> selectRecentUnusedCodes(@Param("oneHourAgo") LocalDateTime oneHourAgo);
    
    /**
     * 根据手机号查询验证码（按创建时间倒序）
     * 
     * @param phone 手机号
     * @return 验证码列表
     */
    List<VerificationCode> selectByPhoneOrderByCreateTimeDesc(@Param("phone") String phone);
    
    /**
     * 检查是否存在最近的验证码（用于频率限制）
     * 
     * @param phone 手机号
     * @param createTime 创建时间
     * @return 是否存在
     */
    boolean existsByPhoneAndCreateTimeAfter(@Param("phone") String phone, 
                                          @Param("createTime") LocalDateTime createTime);
    
    /**
     * 删除过期的验证码
     * 
     * @param now 当前时间
     * @return 影响行数
     */
    int deleteExpiredCodes(@Param("now") LocalDateTime now);
    
    /**
     * 更新验证码信息
     * 
     * @param verificationCode 验证码信息
     * @return 影响行数
     */
    int update(VerificationCode verificationCode);
    
    /**
     * 删除验证码
     * 
     * @param id 验证码ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 查询所有验证码
     * 
     * @return 验证码列表
     */
    List<VerificationCode> selectAll();
}
